AWS Elemental MediaPackage v2でタイムシフト再生をしてみた

AWS Elemental MediaPackage v2でタイムシフト再生をしてみた

MediaPackage v2でもManifest URLにstart、endのパラメータを指定してリクエストすることでTime-shifted viewingが可能です。あらかじめStartover windowでシフト可能な時間を確認しておきましょう。
Clock Icon2024.10.31

はじめに

清水です。昨年2023年5月にリリースされたAWS Elemental MediaPackage v2でタイムシフト再生(Time-shift viewing)をやってみました。Time-shift viewingについてはMediaPackage v1のころからサポートされていた機能で、MediaPackage v2でもリリースの際にはでにサポートされていたかと記憶しています。とはいえ、筆者はv2版のTime-shift viewingを設定したことがなかったため、改めて手順などまとめ、動作を確認してみたしだいです。

AWS Elemental MediaPackage v2 User Guideの以下のページを参照しながら進めていきます。

またMediaPackage v1で検証した以下エントリなども参照しながら進めました。6年前のエントリとなりますが、どのような違いがあるでしょうか!?

なお上記エントリでは、最終的な動画視聴をCloudFront経由で行っており、そのためのCloudFront設定についても触れています。ただ今回のエントリではあくまでMediaPackage v2のTime-shift viewingの設定や動作を確認したかったため、CloudFrontの設定については省略、MediaPackage v2 Origin endpointから直接、動画の視聴を行っています。

MediaPackage v2でTime-shift viewingをするためのリソース作成

まずはMediaPackage v2と、MediaLiveのリソースをそれぞれ作成していきます。

MediaPackage v2リソースの作成

MediaPackage v2リソースのChannelの作成からはじめます。Channel groupについては以下エントリなどを参照に作成したものを使用します。

Channel group詳細画面の[Create channel]ボタンから進みます。NameとDescriptionを適切に入力します。Input typeはCMAFを選択しました。Channel policyはDon't attach a policyでChannelを[Create]します。

ts01

Channelが作成できました。続いて[Create endpoint]ボタンからOrigin endpointを作成します。

ts02

NameとDescriptionを適切に入力、Container typeはCMAFとしました。Additional settingsの項目を展開し、Startover window (sec.)を確認しましょう。このStartover windowで指定した時間分だけ、過去にさかのぼってのタイムシフト再生が可能です。デフォルトでは900(900秒=15分)となっていましたが、今回は3600(3,600秒=60分)と設定しました。

ts08

Segment settingsとEncryptionはデフォルト設定のまま進めます。Endpoint policyはAttach a public policyを今回は選択しました。用途に合わせた適切なPolicyを選択しましょう。

ts04

ts05

Manifest definitionsではHLS manifestを追加、Manifest nameならびにChild manifest nameを適切に設定します。そのほかの項目はデフォルトでOrigin endpointを[Create]します。

ts06

ts07

Origin Endpointが作成できました。

ts09

MediaLiveリソースの作成

続いてはMediaLiveリソースを作成します。InputについてはRTMP (push) Input type、SINGLE_INPUT Input classで作成しておきます。

ts10

ts11

ts12

ts33

MediaLive Channelについては、以下ブログエントリで作成したChannelをベースにします。

具体的には以下のChannel templateを使用します。

medialive-cmaf-ingest-channel-template.json

GitHub Gistのページからファイルをローカルにダウンロード、Create channelのChannel template、[Select cutom template]ボタンからファイルを読み込みます。

ts14

テンプレートを読み込んだあと、Chanel nameやIAM role、Channel classなどの設定を行います。またInput attachmentsでは先ほど作成したInputをAttachします。

ts15

Output groups内、各Outputについての設定はテンプレート内で定義されています。出力先、CMAF Ingest destinationだけ設定しておきましょう。MediaPackageのマネジメントコンソール、さきほど作成したMediaPackage ChannelのSettignsの項目を確認します。Ingest endpoint 1のURLメモしておきましょう。

ts16

MediaPackage ChannelのIngest endpoint 1のURLをMediaLive側、CMAF Ingest destination AのURL欄に入力します。Credentialsについてはそのまま(指定なし)でかまいません。

ts17

MediaLive Channelの設定、最後にTimecodeについての設定を行います。これは、MediaPackage v1でタイムシフト再生をしたときには意識していなかったのですが、以下を確認するとMediaLiveでSYSTEMCLOCKのTimecodeを設定しておいたほうがよさそう、と認識しています。特に今回は映像の打ち上げにOBS Studioを使用するため、MediaLiveへの入力となる映像自体にTimecodeを埋め込むことができません。

General settingsの項目からTimecode Configurationを確認します。SourceがEMBEDDEDになっていますので、これをSYSTEMCLOCKに変更します。

ts18

以上でMediaLive Channelの設定が完了です。[Create channel]してChannelを作成しましょう。

ts19

ライブストリームの開始とタイムシフトなしの視聴確認

MediaPackage v2とMediaLive、それぞれのリソースが作成できたらライブストリームを開始して、まずはタイムシフトなしの映像視聴を確認しましょう。

MediaLiveをStartさせます。
今回、Streaming SoftwareにはOBS Studioを利用しました。RTMPでMediaLiveに映像を打ち上げます。

ts25

MediaLiveをStartさせ、OBS Studioで[配信開始]ボタンを押下します。

ts26

MediaLiveのマネジメントコンソール、Channel詳細画面のPreviewで問題ないことをまずは確認します。

ts27

続いて、MediaPackageのOrigin endpoint詳細ページ、Manifest settingsの項目を確認します。[Preview]ボタンを押下しましょう。

ts20

hls.js demoページが、Playback URLを読み込んだかたちで開きます。タイムシフト再生のない、シンプルなライブストリームが再生できていることが確認できますね。

ts21

ここで、このシンプルなライブストリームのHLS ManifestファイルならびにChild manifestファイルについて確認してみましょう。curlコマンドでPlayback URLにアクセスしてみます。まずはManifestファイルです。2つのChild manifestファイルが含まれていることが確認できますね。

% curl https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8

続いてvariant_video_1080p30.m3u8のほうのChild manifestファイルについて確認してみます。segment_video_1080p30_288104919.mp4からsegment_video_1080p30_288104928.mp4まで、10個のSegmentファイルが含まれていました。6秒x10で合計60秒、これはMediaPackage Origin endpointのManifest windowの値と一致する認識です。

% curl https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/variant_video_1080p30.m3u8
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288104919
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-MAP:URI="segment_video_1080p30_288104887_init.mp4"
#EXTINF:6.006,
segment_video_1080p30_288104919.mp4
#EXTINF:6.006,
segment_video_1080p30_288104920.mp4
#EXTINF:6.006,
segment_video_1080p30_288104921.mp4
#EXTINF:6.006,
segment_video_1080p30_288104922.mp4
#EXTINF:6.006,
segment_video_1080p30_288104923.mp4
#EXTINF:6.006,
segment_video_1080p30_288104924.mp4
#EXTINF:6.006,
segment_video_1080p30_288104925.mp4
#EXTINF:6.006,
segment_video_1080p30_288104926.mp4
#EXTINF:6.006,
segment_video_1080p30_288104927.mp4
#EXTINF:6.006,
segment_video_1080p30_288104928.mp4

タイムシフト再生をManifestファイルで確認

さて、タイムシフト機能を使わない、通常のライブストリームの視聴ならびにManifestファイルが確認できました。続いて本題のタイムシフト再生の確認に移ります。まずはManifestファイルから確認していきます。

startとendパラメータを指定してタイムシフト再生

MediaPackage v2でのタイムシフト再生、基本的な使い方はMediaPackage v1のタイムシフト再生と同じでPlayback URLの末尾にクエリ文字列を付与するかたちです。

startend、2つのクエリ文字列でそれぞれ開始時間と終了時間をを指定します。値はISO 8601またはPOSIX形式での指定となります。以下のようになりますね。

  • ?start=2024-10-31T08:00:00Z&end=2024-10-31T08:30:00Z
    • 開始時間2024/10/31 17:00:00 (JST)。終了時間2024/10/31 17:30 (JST)
      • 実際はUTC時間(JSTで17:00:00ならUTCは08:00:00)で指定
  • ?start=1730360700&end=1730361300
    • 開始時間2024/10/31 16:45:00 (JST)。終了時間2024/10/31 16:55:00 (JST)

以下、ISO 8601形式のUTC時間で指定して確認していきます。いずれも検証している時間から60分(Startover windowで指定した時間)以内の時間を指定しています。

まずはManifestファイルです。Playback URLにクエリ文字列?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Zを付与してリクエストしてみます。クエリ文字列をつけないときと同じく、2つのChild manifestファイルが含まれていますが、それぞれの末尾に同じクエリ文字列が付与されていることがわかります。

% date -Iseconds
2024-10-31T17:39:12+09:00

% date -Iseconds -u
2024-10-31T08:39:15+00:00

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z

続いてVariant、variant_video_1080p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Zを取得してみます。segment_video_1080p30_288105795.mp4からsegment_video_1080p30_288105824.mp4まで、30個のSegmentファイルが含まれていました。6秒x30で合計180秒、startとendで指定した3分間と一致しますね。

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/variant_video_1080p30.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:33:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288105795
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-MAP:URI="segment_video_1080p30_288104887_init.mp4"
#EXTINF:6.006,
segment_video_1080p30_288105795.mp4
#EXTINF:6.006,
segment_video_1080p30_288105796.mp4
#EXTINF:6.006,
segment_video_1080p30_288105797.mp4
#EXTINF:6.006,
segment_video_1080p30_288105798.mp4
#EXTINF:6.006,
segment_video_1080p30_288105799.mp4
#EXTINF:6.006,
segment_video_1080p30_288105800.mp4
#EXTINF:6.006,
segment_video_1080p30_288105801.mp4
#EXTINF:6.006,
segment_video_1080p30_288105802.mp4
#EXTINF:6.006,
segment_video_1080p30_288105803.mp4
#EXTINF:6.006,
segment_video_1080p30_288105804.mp4
#EXTINF:6.006,
segment_video_1080p30_288105805.mp4
#EXTINF:6.006,
segment_video_1080p30_288105806.mp4
#EXTINF:6.006,
segment_video_1080p30_288105807.mp4
#EXTINF:6.006,
segment_video_1080p30_288105808.mp4
#EXTINF:6.006,
segment_video_1080p30_288105809.mp4
#EXTINF:6.006,
segment_video_1080p30_288105810.mp4
#EXTINF:6.006,
segment_video_1080p30_288105811.mp4
#EXTINF:6.006,
segment_video_1080p30_288105812.mp4
#EXTINF:6.006,
segment_video_1080p30_288105813.mp4
#EXTINF:6.006,
segment_video_1080p30_288105814.mp4
#EXTINF:6.006,
segment_video_1080p30_288105815.mp4
#EXTINF:6.006,
segment_video_1080p30_288105816.mp4
#EXTINF:6.006,
segment_video_1080p30_288105817.mp4
#EXTINF:6.006,
segment_video_1080p30_288105818.mp4
#EXTINF:6.006,
segment_video_1080p30_288105819.mp4
#EXTINF:6.006,
segment_video_1080p30_288105820.mp4
#EXTINF:6.006,
segment_video_1080p30_288105821.mp4
#EXTINF:6.006,
segment_video_1080p30_288105822.mp4
#EXTINF:6.006,
segment_video_1080p30_288105823.mp4
#EXTINF:6.006,
segment_video_1080p30_288105824.mp4
#EXT-X-ENDLIST

startパラメータのみを指定したタイムシフト再生

タイムシフト再生の際、クエリ文字列のend parameterは省略することが可能です。Playback URLに?start=2024-10-31T08:42:00Zというクエリ文字列のみを付与してリクエストしてみます。Manifestファイル内、Child manifestファイルの末尾のクエリ文字列もstartのみになっていますね。

% date -Iseconds
2024-10-31T17:44:01+09:00

% date -Iseconds -u
2024-10-31T08:44:04+00:00

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:42:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:42:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:42:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:42:00Z

Variantファイル、variant_video_1080p30.m3u8?start=2024-10-31T08:42:00Zについてもアクセスしてみます。Segmentファイルは21個、これだけではわかりにくいのですが、startで指定した時間から最新のSegmentファイルまでが列挙されています。

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/variant_video_1080p30.m3u8?start=2024-10-31T08:42:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-PLAYLIST-TYPE:EVENT
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:288105915
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-MAP:URI="segment_video_1080p30_288104887_init.mp4"
#EXTINF:6.006,
segment_video_1080p30_288105915.mp4
#EXTINF:6.006,
segment_video_1080p30_288105916.mp4
#EXTINF:6.006,
segment_video_1080p30_288105917.mp4
#EXTINF:6.006,
segment_video_1080p30_288105918.mp4
#EXTINF:6.006,
segment_video_1080p30_288105919.mp4
#EXTINF:6.006,
segment_video_1080p30_288105920.mp4
#EXTINF:6.006,
segment_video_1080p30_288105921.mp4
#EXTINF:6.006,
segment_video_1080p30_288105922.mp4
#EXTINF:6.006,
segment_video_1080p30_288105923.mp4
#EXTINF:6.006,
segment_video_1080p30_288105924.mp4
#EXTINF:6.006,
segment_video_1080p30_288105925.mp4
#EXTINF:6.006,
segment_video_1080p30_288105926.mp4
#EXTINF:6.006,
segment_video_1080p30_288105927.mp4
#EXTINF:6.006,
segment_video_1080p30_288105928.mp4
#EXTINF:6.006,
segment_video_1080p30_288105929.mp4
#EXTINF:6.006,
segment_video_1080p30_288105930.mp4
#EXTINF:6.006,
segment_video_1080p30_288105931.mp4
#EXTINF:6.006,
segment_video_1080p30_288105932.mp4
#EXTINF:6.006,
segment_video_1080p30_288105933.mp4
#EXTINF:6.006,
segment_video_1080p30_288105934.mp4
#EXTINF:6.006,
segment_video_1080p30_288105935.mp4

クエリ文字列の指定方法について

検証している際、クエリ文字列として指定するstartとendについて、少し癖のようなものがあることが確認できました。MediaPackage v2の仕様なのか、MediaLiveでSYSTEMCLOCK Timecodeを設定しているためか、詳細はわからないのですが、今回はこれらの事情でUTCで指定することとしました。

検証の際、まずはISO 8601形式で、最も馴染み深いJSTで指定しようと試みました。結果は以下のように、パラメータがおかしいという旨のメッセージが返ってきてしまいます。

% date -Iseconds
2024-10-31T17:48:09+09:00

% date -Iseconds -u
2024-10-31T08:48:10+00:00

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T17:45:00+09:00"
{"Message":"MediaPackage can't process your request because you queried primary playlist path without including a valid start parameter. Retry your query request with a valid start parameter described in https://docs.aws.amazon.com/mediapackage/latest/userguide/time-shifted.html#start-and-end-parameters-rules."}

しかし、同じタイミングで時刻をUTCで指定するとManifestファイルが返ってきました。

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:45:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:45:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:45:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:45:00Z

またUser Guideにならい、-08:00のタイムゾーンを指定してみました。これは問題なくManifestファイルが返ってきます。(-08:00がよくて+09:00がダメなのがちょっと不思議な感じがしますが……。深追いしても仕方ないかなと、JST +09:00の利用は断念しました。)

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T00:45:00-08:00"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T00:45:00-08:00",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T00:45:00-08:00
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T00:45:00-08:00

なおUTCで指定する場合でも、+00:00ではダメでZと指定する必要がありました。(macOSでdate -Iseconds -uで取得できるのが+00:00だったので、これが使えるとよかったのですが。)

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:45:00+00:00"
{"Message":"MediaPackage can't process your request because you queried primary playlist path without including a valid start parameter. Retry your query request with a valid start parameter described in https://docs.aws.amazon.com/mediapackage/latest/userguide/time-shifted.html#start-and-end-parameters-rules."}
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:45:00Z"
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:LANGUAGE="und",AUTOSELECT=YES,CHANNELS="2",TYPE=AUDIO,URI="variant_audio_aac.m3u8?start=2024-10-31T08:45:00Z",GROUP-ID="audio_0",DEFAULT=NO,NAME="und"
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.640028",AVERAGE-BANDWIDTH=5000000,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=5000000,AUDIO="audio_0"
variant_video_1080p30.m3u8?start=2024-10-31T08:45:00Z
#EXT-X-STREAM-INF:CODECS="mp4a.40.2,avc1.64001F",AVERAGE-BANDWIDTH=3000000,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=29.97,BANDWIDTH=3000000,AUDIO="audio_0"
variant_video_720p30.m3u8?start=2024-10-31T08:45:00Z

タイムシフト再生を実際の映像を視聴して確認

タイムシフト再生について、まずはManifestファイルでの確認ができました。通常のライブストリームと異なり、Child manifestファイルに多くのSegmentが列挙されていましたね。続いて、タイムシフト再生を実際の映像で視聴して確認していましょう。

hls.js demoページを使った視聴確認

まずはMediaPackageのマネジメントコンソールから確認できるhls.js demoのページを再生環境として使用します。

Playback URLにクエリ文字列を付与した以下を指定し、[Apply]ボタンを押下します。

  • https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:30:00Z&end=2024-10-31T08:45:00Z

ts22

再生がはじまりました!パラメータで指定したstartとendが反映され、15分間のコンテンツとして扱われています。

ts23

続いて、endパラメータをなくしてstartパラメータのみで確認してみましょう。以下URLを入力して[Apply]ボタンを押下します。

  • https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:50:00Z

最新のライブストリームが再生されますが、シークバー部分を確認してみましょう。startパラメータで指定した時間まで戻ることができます。

ts28

ts29

最新のライブストリームが視聴できつつ、シークバーの操作でstartで指定した過去にも戻れる、というぐあいですね。ただ、いちどシークバーを操作して過去に戻った場合、最新のライブストリームに戻るのがちょっと大変そうです。(シークすればいいだけではありますが。)

Video.jsを使った視聴確認

この、タイムシフト再生で過去に戻ったあと、最新のライブストリームに簡単に戻る方法、以前MediaPackage v1でやったときはどうしていたっけ?と、以前のエントリを再度確認してみました。(6年前ということで、ちょっとうろ覚えになってしまっています……。)

タイムシフト再生用にvideojs-dvrseekbarをVideo.jsプレイヤーに設定する」という章で扱っているのですが、Video.jsのプラグインの1つである「videojs-dvrseekbar」を利用していました。

ただ、当時参照していたdist/videojs-dvrseekbar.jsというファイルが現在はありません。以前は以下URLで参照できていたようなのですが、現在では404 - page not foundとなってしまいます。

少し調べてみたところ、Video.js 7以降ではdvrseekbarプラグイン自体がVideo.jsに取り込まれたようです。

そのため、別途プラグインを読み込まずとも、Video.jsのライブラリさえ読み込めばDRV機能にも対応できるとのこと。上記URL記載の情報を参考に(真似して)、以下のような視聴ページを作成しました。Video.jsのバージョンは確認できた最新版(8.16.1)を利用しています。

empv2-time-shifted-viewing.html
<html>
  <head>
    <title>MediaPackage v2 Time-shifted viewing</title>
    <link href="https://vjs.zencdn.net/8.16.1/video-js.min.css" rel="stylesheet">
  </head>
  <body>
    <video id="example-video" width="1280" height="720"
       class="video-js vjs-default-skin" controls>
    </video>
    <script src="https://vjs.zencdn.net/8.16.1/video.min.js"></script>
    <!--<script src="./videojs-contrib-hls.js"></script>-->
    <script>
      let hls =  {
        src: "https://example.com/path/to/manifest.m3u8",
        type: "application/x-mpegURL" };
      let options = {
        liveui: true };
      let readyPlayer = function () {
        this.src(hls); };
      let player = videojs("example-video", options, readyPlayer);
    </script>
  </body>
</html>

src: "https://example.com/path/to/manifest.m3u8",の箇所をsrc: "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/time-shifted-viewing-channel/time-shifted-viewing-origin-endpoint/index.m3u8?start=2024-10-31T08:50:00Z","と、Playback URLにタイムシフト再生用のクエリ文字列を付けたものに置き換えます。

このHTMLファイルをApache HTTP Serverの稼働するAmazon EC2に配置し、HTTPでアクセスできるようにします。ブラウザでアクセスして再生ボタンを押すと、以下のようにライブストリームの再生がはじまりました。右下にLIVEのマークがありますね。

ts30

過去にシークすると、LIVEマークの赤い印が消えます(グレーになります)。

ts31

ライブストリームに戻りたい場合はLIVEマークをクリックしてみましょう。LIVEマークに赤い印がつき、ライブストリームに戻ります!

ts32

まとめ

MediaPackage v2でタイムシフト再生(Time-shift viewing)をやってみました。基本的にな使い方はMediaPackage v1と同じで、あらかじめタイムシフト再生したい時間分のStartover Windowを指定しておきます。(マネジメントコンソールでOrigin endpointを作成した場合、デフォルトで900秒が設定されています。ただ15分以上のタイムシフト再生をしたい場合はこの数値を変更する必要があるので注意しましょう。)再生する際、ManifestファイルのURLにstartendのクエリ文字列を付与してリクエストを行います。startのみ指定してライブストリームから過去にさかのぼることができる視聴体験も簡単に実現できますが、その際はライブストリームに戻りやすいようなUIがある動画プレイヤーを使うとよさそうですね。

なお、今回CloudFrontの設定について省略しましたが、実際に設定する際にはクエリ文字列をオリジンに転送する設定を忘れないようにしましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.